<?php

namespace Pinenut\Files;

use \Action as Base;

/**
 * Отдаём оригинал файла
 * @author kosh
 *
 */
abstract class FileAction extends Base {
	protected static $isPublic = true;
	
	protected $_modelClass;// = '\Files\Files';

	static function pullParams() {
		return ['httpIfNoneMatch', 'httpIfModifiedSince'];
	}

	protected function run() {
		$this->response->noRender ( true );

		$class = $this->_modelClass;
		$file = $class::find($this->request->id);

		if (empty($file)) {
			throw new \Exception('Not found', 404);
		}

		$file = $file->file;

		// ахтунге - файло помещаеццо в память и отдаёцца пользователю...
		// TODO: подключить header('X-Accel-Redirect: ');

		$modified = $file->created;

		$lifetime = intval((time() - $modified) / 5) + 10;

		// проверяем - может запрашиваемый файл и не модифицировался,
		// тогда нужно корректно ответить 304 и ничего не отдавать для экономии трафика
		if ($this->request->_httpIfNoneMatch == $file->md5
		|| strtotime($this->request->_httpIfModifiedSince) == $modified) {
			$this->response->code(304, 'Not Modified');
			return;
		}

		$this->response->header('Content-Type: ' . $file->mimeType);
		$this->response->header('Etag: ' . $file->md5);
		$this->response->header('Last-Modified: ' . date(DATE_ATOM, $modified));
		$this->response->header('Cache-Control: ' . 'private, must-revalidate, max-age='.$lifetime);
		$this->response->header('Expires: ' . date(DATE_ATOM, time() + $lifetime));

		echo $file->getBytes ();
	}
}